var APP = {};

var APP_TIME_OUT = 911;

var loading_count = 0;

var isF5 = false;


function loadPost(url, params, target, isBack) {
    try {
        $.ajax({
            cache: false,
            type: "POST",
            url: url,
            data: params,
            async: true,
            beforeSend: function (xhr) {
                loading_count++;
                $("div[name='requestProccer']").show();
            },
            success: function (result) {
                try {
                    $(target).html(result);
                } catch (e) {
                    log(e.name + ": " + e.message, "error");
                }
                if (isBack != null && isBack == true) {
                    var sTarget = target;
                    if (target.selector != null) {
                        sTarget = target.selector;
                    }
                    saveHash(url, "loadPost('" + url + "', '" + params + "', '"
                        + sTarget + "', false);");
                }
            },
            complete: function (xhr, ts) {
                $("div[name='requestProccer']").hide();
                if (xhr.status == APP_TIME_OUT) {
                    window.location.reload(true);
                    return;
                }
                loading_count--;
                if (loading_count == 0) {
                    if (ts == "success") {

                    } else {

                    }
                }
            },
            error: function () {
                $("div[name='requestProccer']").hide();
            }
        });
    } catch (e) {
        alert(e);
    }
}

function loadFormContent(url, params, targer) {
    $.ajax({
        url: url,
        type: "post",
        dataType: "html",
        data: params,
        success: function (html) {
            $(targer).html(html);
        }
    });
}


function showInfo(msg, actHtml, range) {
    if (msg != null && msg.length > 0) {
        $(".J_info_msg").html(msg);
        $(".J_info_msg").show();
    } else {
        $(".J_info_msg").html('app.vi.js的showInfo方法输出');
        $(".J_info_msg").show();
    }

    if (actHtml != null && actHtml.length > 0) {
        $(".J_info_act").html(actHtml);
        $(".J_info_act").show();
    } else {
        $(".J_info_act").html('');
        $(".J_info_act").hide();
    }

    var timeout = 5000;
    if (range > 0) {
        timeout = range;
    }
    $(".J_info").slideDown(300);
    setTimeout(function () {
        $(".J_info").slideUp(300);
    }, timeout);

}

function load(url) {
    var target ="#myContent";
    var isBack = true;
    try {
        $.ajax({
            url: url,
            cache: false,
            async: true,
            beforeSend: function (xhr) {
                loading_count++;
                $("div[name='requestProccer']").show();
                $(".J_Loading").show();
            },
            success: function (result) {
                $("div[name='requestProccer']").hide();
                try {
                    $(target).html(result);
                } catch (e) {
                    log(e.name + ": " + e.message, "error");
                }
                if (isBack != null && isBack == true) {
                    var sTarget = target;
                    if (target.selector != null) {
                        sTarget = target.selector;
                    }
                    saveHash(url, "load('" + url + "', '" + sTarget
                        + "', false);");
                }
            },
            complete: function (xhr, ts) {
                $("div[name='requestProccer']").hide();
                if (xhr.status == APP_TIME_OUT) {
                    window.location.reload(true);
                    return;
                }
                loading_count--;
                if (loading_count == 0) {
                    if (ts == "success") {
                        $(".J_Loading").hide();
                    } else {
                        $(".J_Loading").html(
                            "loaded but error!!!! status:" + xhr.status);
                    }
                }
            },
            error: function () {
                $("div[name='requestProccer']").hide();
            }
        });
    } catch (e) {
        alert(e);
    }
}




var hisMap = new Map();
var initUrl = null;
var saveHashCount = 0;
var moduleImpl = "";
var contentImpl = "";

function saveHash(url, func) {
    if (initUrl == null) {
        initUrl = window.location.href;
        var pos = initUrl.indexOf('#');
        if (pos > 0) {
            initUrl = initUrl.substring(0, pos);
        }
    }
    var base64 = new Base64();
    var encFunc = base64.encode(func);
    var encModuleImpl = "";
    if (moduleImpl != "" && moduleImpl.length > 0) {
        encModuleImpl = base64.encode(moduleImpl);
    }
    var encContentImpl = "";
    if (contentImpl != "" && contentImpl.length > 0) {
        encContentImpl = base64.encode(contentImpl);
    }
    var hashUrl = "#!module=" + url + "%7A" + encModuleImpl + "%7B"
        + encContentImpl + "%7C" + encFunc;
    // if (data != null) {
    // hashUrl = hashUrl + data;
    // }
    saveHashCount++;
    window.location = initUrl + hashUrl;
    hisMap.put(hashUrl, func);
    //isSaveHash = true;
}

function _decode(encJs) {
    var base64 = new Base64();
    if (encJs != null && encJs.length > 0) {
        return base64.decode(encJs);
    }
    return null;
}

function loadHash(hashUrl) {
    var tagA = hashUrl.indexOf("%7A");
    var tagB = hashUrl.indexOf("%7B");
    var tagC = hashUrl.indexOf("%7C");

    var encJsA = hashUrl.substring(tagA + 3, tagB);
    var encJsB = hashUrl.substring(tagB + 3, tagC);
    var encJsC = hashUrl.substring(tagC + 3);
    var jsA = _decode(encJsA);
    var jsB = _decode(encJsB);
    var jsC = _decode(encJsC);

    if (jsA != null && jsA.length > 0 && jsA != moduleImpl) {
        moduleImpl = jsA;
        eval(jsA);
        return true;
    } else if (jsB != null && jsB.length > 0 && jsB != contentImpl) {
        contentImpl = jsB;
        eval(jsB);
    } else if (jsC != null && jsC.length > 0) {
        eval(jsC);
        return true;
    }
    return false;
}

window.onhashchange = function () {
    var hashStr = location.hash;
    if (saveHashCount <= 0) {
        loadHash(hashStr);
    }
    saveHashCount--;
    if (saveHashCount < 0) {
        saveHashCount = 0;
    }
}


function logout() {
    load('web/version/test.htm', 'test');
}

function log(msg, type) {
    try {
        if (type != null) {
            if (type == "error") {
                console.error(msg);
            } else if (type == "warn") {
                console.warn(msg);
            } else if (type == "info") {
                console.info(msg);
            } else {
                console.log(msg);
            }
        } else {
            console.log(msg)
        }
    } catch (e) {

    }
}

function Map() {
    this.container = new Object();
}

Map.prototype.put = function (key, value) {
    this.container[key] = value;
}

Map.prototype.get = function (key) {
    return this.container[key];
}

Map.prototype.keySet = function () {
    var keyset = new Array();
    var count = 0;
    for (var key in this.container) {

        if (key == 'extend') {
            continue;
        }
        keyset[count] = key;
        count++;
    }
    return keyset;
}

Map.prototype.size = function () {
    var count = 0;
    for (var key in this.container) {

        if (key == 'extend') {
            continue;
        }
        count++;
    }
    return count;
}

Map.prototype.remove = function (key) {
    delete this.container[key];
}

Map.prototype.toString = function () {
    var str = "";
    for (var i = 0, keys = this.keySet(), len = keys.length; i < len; i++) {
        str = str + keys[i] + "=" + this.container[keys[i]] + ";\n";
    }
    return str;
}

function Base64() {

    // private property
    _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    // public method for encoding
    this.encode = function (input) {
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;
        input = _utf8_encode(input);
        while (i < input.length) {
            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);
            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;
            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }
            output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2)
                + _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
        }
        return output;
    }

    // public method for decoding
    this.decode = function (input) {
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;
        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
        while (i < input.length) {
            enc1 = _keyStr.indexOf(input.charAt(i++));
            enc2 = _keyStr.indexOf(input.charAt(i++));
            enc3 = _keyStr.indexOf(input.charAt(i++));
            enc4 = _keyStr.indexOf(input.charAt(i++));
            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;
            output = output + String.fromCharCode(chr1);
            if (enc3 != 64) {
                output = output + String.fromCharCode(chr2);
            }
            if (enc4 != 64) {
                output = output + String.fromCharCode(chr3);
            }
        }
        output = _utf8_decode(output);
        return output;
    }

    // private method for UTF-8 encoding
    _utf8_encode = function (string) {
        string = string.replace(/\r\n/g, "\n");
        var utftext = "";
        for (var n = 0; n < string.length; n++) {
            var c = string.charCodeAt(n);
            if (c < 128) {
                utftext += String.fromCharCode(c);
            } else if ((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            } else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }
        return utftext;
    }

    // private method for UTF-8 decoding
    _utf8_decode = function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;
        while (i < utftext.length) {
            c = utftext.charCodeAt(i);
            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            } else if ((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i + 1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            } else {
                c2 = utftext.charCodeAt(i + 1);
                c3 = utftext.charCodeAt(i + 2);
                string += String.fromCharCode(((c & 15) << 12)
                    | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }
        }
        return string;
    }
}

$(document).ready(function () {

    $('tbody tr').hover(function () {
        $(this).addClass('odd');
    }, function () {
        $(this).removeClass('odd');
    });

});